部署: AWS EC2 + LAMP + phpmyadmin + Filezilla


Posted by Christy on 2021-09-23

本篇為部署背景知識 + 實作筆記,選用的是 AWS EC2 遠端主機、建立 LAMP 環境、資料庫 phpmyadmin 及 Filezilla 上傳網頁

一開始完全沒有頭緒,是先跟著參考資料部署完成以後,才慢慢理解部署的相關名詞。可以先大概看一下,等部署完再回來看會更清楚。

分成部署前的背景知識及部署流程。

部署前的背景知識:

aws 名詞解釋

在 Amazon Web Services(以下簡稱 aws) 裡,所有產品都有自己的名稱,一開始使用會有點疑惑,以下為相關名詞解釋:

1. AWS: Amazon Web Services

亞馬遜雲端服務,網路只是其中一塊,還有跨足運算、儲存、資料庫、分析等等。

2. AMI: Amazon Machine Image

亞馬遜自有的虛擬光碟映像檔,用來創建虛擬機器。

Image: 光碟映像檔,是一種虛擬光碟的概念,可以不需要有實體光碟機,也可以安裝各種軟體。常見的有三種檔案格式:.IMG, .ISO, .BIN。

實際運用:比如說我想要在 mac 電腦上裝 Linux 系統,可以去下載 ubuntu 這個版本,然後把下載的 ISO 檔放入隨身碟中,做一個開機灌系統的隨身碟。

3. Amazon EC2: Amazon Elastic Compute Cloud

亞馬遜自有的虛擬主機,使用者可在裡面運行任何軟體或應用程式。

4. instance: 虛擬主機

解惑時間:EC2 vs instance 差別在哪?

EC2 是主機型號;instance 則是虛擬主機。

可點進去 aws 的 compute 裡面,除了 EC2 以外,還可以選擇 AWS Lambda, AWS Batch 等等。

可以把 EC2, AWS Lambda, AWS Batch 想成是亞馬遜自有的虛擬主機型號,而 instance 是主機總稱。舉個例子,大同電鍋裡面有 A, B, C 三種型號(EC2, AWS Lambda, AWS Batch),但他們都是一種電鍋(instance)。

部署名詞介紹

一、部署軟體包

1. LAMP

一種架站應用程式組合包,會成為主流的原因是開源及普遍性。

Linux: 作業系統,這裡用的是其中一個版本叫 ubuntu。

Apache: Server 伺服器是什麼?有哪些種類?

MySQL: 資料庫管理系統

PHP: 程式語言

2. phpmyadmin

因為 MySQL 是沒有介面的,所以用 phpmyadmin 這套軟體來管理資料庫。

[Day15] 資料庫 - 介紹與比較

3. Filezilla

一種跨平台的 FTP 檔案傳輸軟體,可以把多個檔案或資料夾上傳至遠端主機。

二、部署中的專有名詞

1. ssh: Secure Shell

一種加密的網路傳輸協議,常用於登入遠端系統中。

[Security] 你該知道所有關於 SSH 的那些事

2. sudo: substitute user do

是一套在類 Unix 作業系統上的程式,用來執行只有管理員才能做的任務。

一開始叫做 superuser do,後來衍伸為標題的意思,logo 是一個三明治,挺可愛的。

3. apt: Advanced Packaging Tools

在 ubuntu 上面管理軟體的程式,用來安裝/移除/升級套件,類似 npm。

4. tasksel

可以快速安裝 LAMP 環境的一個套件。

5. root: 最高管理員

6. ufw: Uncomplicated Firewall

ubuntu 系統上預設的防火牆套件,主要為了簡化 iptables 的操作。

ufw:簡易防火牆設置

PS 防火牆什麼時候要開?
通常在環境建置好以後,上傳資料庫跟網頁之前就可以先打開了。

有了這些背景知識以後,我們可以開始部署流程了。


部署流程

由於這篇文章 部署 AWS EC2 遠端主機 + Ubuntu LAMP 環境 + phpmyadmin 已經寫得很清楚了,這裡只紀錄文字版本,並補充一些知識點。
部署大致上有四個重點:設置遠端主機、建立環境、設置資料庫及上傳網頁

以下提到的 IPv4 皆是指 Public IPv4 address

一、設定 AWS EC2 遠端主機

1. 建立帳號登入後台:Amazon Web Services

2. 右上角地區選項:

可選離自己近的;還是美東或美西有一個比較便宜的也行。

假設發現自己主機不見了,有可能是地區選錯了。

3. 啟動虛擬機器,選 EC2:Launch a virtual machine with EC2

4. 進入 Step1 - 6 選項:

Step 1: Choose an Amazon Machine Image (AMI)

選最新版的 ubuntu

Step 2: Choose an Instance Type

選 Free tier eligible 那一個,接下來可以一路按 Next 到 Step 6 停下來

Instance Type: 不同主機的等級

Step 3: Configure Instance Details

這一頁基本上都是網路相關的設定,可以不用改動

Step 4: Add Storage: 主機硬碟大小,預設 8G

Step 5: Add Tags:方便管理主機,但用不到不用管

Step 6: Configure Security Group

aws 上面防火牆的規則;可以用 ssh 指令連到主機,source 是指「允許什麼 ip 連線」;0.0.0.0/0 -> 允許所有 ip 都可以連得到;

除了預設的 ssh,可以新增 HTTP/HTTPS/MySQL(port 3306) 這些規則

選好以後按 review and launch,確認沒問題以後就可以 launch

Step 7: Review Instance Launch: 下載 private key file 到電腦裡 -> launch instance

接著就可以進到自己的主機裡面了,按 connetc 即可連線

把 IPv4 Public IP 記下來,接下來會常用到它

二、進入遠端主機

遠端主機只能到 terminal 用 CLI 指令操作

1. 用 ssh 這個安全協議,連線到遠端伺服器

$ ssh -i ~/path/key.pem ubuntu@IPv4

tips: 可以直接把 key.pem 拖進 terminal 會自動生成路徑

2. 進入遠端主機

如果發現你的 terminal 變成 ubuntu@IPv4:~$ 就表示成功連進去了

實用指令:top,會出現你遠端主機所有的資訊;按 q 可離開

三、設定 Ubuntu LAMP 環境

1. 更新 ubuntu 的系統

$ sudo apt update && sudo apt upgrade && sudo apt dist-upgrade

sudo: 用管理員的身份來執行

apt: 在 ubuntu 上面管理軟體的程式;類似 npm update

2. 用 apt 來安裝 tasksel

$ sudo apt install tasksel

tasksel 是一個可以快速安裝 dns server、lamp,等等應用的軟體包

3. 用 tasksel 安裝 lamp-server

$ sudo tasksel install lamp-server

4. 測試 server 有沒有裝好

把 IPv4 貼到瀏覽器上面,有出現 'Apache2 ubuntu default page' 代表成功了

三、安裝 phpmyadmin 在遠端主機裡

1. 安裝 phpmyadmin:

$ sudo apt install phpmyadmin

2. Configuring phpmyadmin:

這裡用按空白鍵的方式,選擇 apache2

3. 設定 phpmyadmin 管理員密碼

在這裡設的密碼,是「管理 phpmyadmin」用的,也就是說裡面的管理員帳號是 phpmyadmin,密碼是這裡設的密碼。

4. 改變 phpmyadmin 登入方式,變成用密碼登入

帳號:root / 密碼:下面接著設定

a. 先用管理員身份登入 mysql: $ sudo mysql -u root mysql

b. 讓 root 可以用密碼登入:$ UPDATE user SET plugin='mysql_native_password' WHERE User='root';

c. 更新權限:$ FLUSH PRIVILEGES;

d. 離開:$ exit

5. 設定 root 密碼

$ sudo mysql_secure_installation

這裡的幾個選項都可選 y,唯獨 'Disallow root login remotely?' 可以選 n (不過我跟著前輩的筆記做,一開始選的是 y)

最後出現 All Done 表示完成了。

6. 登入 MySQL

在瀏覽器輸入:IPv4/phpmyadmin,會看到登入畫面,輸入 root/剛剛設的密碼

PS 如果用 mac,也可以用 Sequel Pro 這套軟體。如果用 Sequel Pro 連線有問題,先登入 phpmyadmin,到「資料庫叫做 phpmyadmin」的權限裡面,把 root 權限 -> 登入資訊 -> 主機選任何主機,改好就可以登入了。

四、設定防火牆

1. 上傳資料或網頁前,先設防火牆

2. 防火牆開了哪些 port

$ sudo ufw status verbose:,通常預設是沒有開

如果忘記自己設了哪些 port,可以到 aws 左側選單 Network & Security 底下的 Security Groups 裡面看或更改設定

3. IPv6 = yes

$ sudo nano /etc/default/ufw: 進到設定裡面,確保 IPv6 = yes

4. 先把 aws Security Groups 設定的 port 都打開

$ sudo ufw allow ssh

$ sudo ufw allow 443

$ sudo ufw allow 3306

$ sudo ufw allow 80

$ sudo ufw allow 22

IPv4 與 IPv6 分別有下面幾個 port

HTTPS: 443
HTTP: 80
SSH: 22
MYSQL/Aurora: 3306

5. 啟用防火牆:

更新:老師說遠端主機的防火牆可以不用開,因為 aws 已經有設定了。但可以參考同學筆記裡面 在 AWS 上面部署 LEMP server 寫得很詳細,就把防火牆打開吧,反正開不用錢

$ sudo ufw enable,會出現:Command may disrupt existing ssh connections. Proceed with operation (y|n)? 選 y

$ sudo ufw status verbose 可以看開了哪些 port

PS 如果還是有防火牆問題,可能是自己電腦端的防火牆設定

如何在Ubuntu 16.04上使用UFW设置防火墙

UFW 防火牆設定軟體操作指南

【Linux】Ubuntu 防火牆設定 - 使用 ufw 指令

五、確認網頁檔案內容

1. 匯出資料庫檔案,再匯入到遠端 phpmyadmin

2. 確認 php 檔案內容

a. conn.php 裡面:

server_name: localhost
username and password: phpmyadmin 登入那組

b. 記得有用到 url 的都要改

http://IPv4/board/檔名

c. 注意資料庫名稱

六、利用 Filezilla 上傳檔案

1. 修改遠端主機的權限

a. 通常網頁檔案會放在 /var/www/html 裡面,但這時還沒有權限可以修改任何資料

b. 進入www 資料夾:$ cd /var/www

c. 用 $ ls -al,可以看到權限只有 root,表示只有管理員有改資料夾的權限

d. 把 html 這個資料夾,改成 ubuntu 這個用戶也有權限修改:$ sudo chown ubuntu /var/www/html

chown: change ownership

2. 建立 Filezilla 新站台

Filezilla 設定:

協定:SFTP - SSH File Transfer Protocol
主機:IPv4
登入型式:金鑰檔案
使用者:ubuntu
金鑰檔案:要連接位置

連線以後,把整個資料夾上傳到 /var/www/html 底下,在瀏覽器輸入 IPv4/index.html 就可以看到網頁了。

PS 也可以在 GitHub 開一個 repo 再 clone,但要記得把 conn.php 放到 .gitignore

PS2 假設部署的是靜態網站,那不用 phpmyadmin,直接把檔案放上去就可以了。

3. 把網域指向 ip

我的網域使用的是 gandi, 在區域檔紀錄把 A 改成 Ipv4

A: 把 ip 對應到網域

CNAME: 設定子網域

輸入自己網域,就可以看到網頁了!

如果對於上述不夠清楚的話,在 W14 直播檢討筆記 影片的後段有詳細的部署介紹。


待研究:
SSL Certificate Cloudflare深入介紹
設定子網域


error logs:

這個錯誤訊息我沒有遇到,老師示範怎麼 debug,紀錄一下思路:

主要在於上傳 PHP 檔案,但瀏覽器卻沒有顯示錯誤

  1. 上傳網頁卻一片空白,出現 500 Internal Server Error

a. google 'php show error on page'
php ini ubuntu lamp

b. 發現顯示錯誤設定應該會在 etc/php7.2/apache2/php.ini 設定檔裡面,更改設定顯示錯誤,若要更改權限:

先到 etc/php7.2/apache2 底下,$ sudo vim php.in

c. 把 display_errors = on 打開

d. 更改任何設定,都要 restart $ sudo service apache2 restart

假設以上方法行不通,可以去 /var/log/apache2/error.log 找錯誤記錄

假設找不到錯誤,試著開別的檔案看看

或者慢慢的一個一個放註解,縮小錯誤範圍










Related Posts

659. Split Array into Consecutive Subsequences

659. Split Array into Consecutive Subsequences

滲透測試基本技術 第二章(後篇)

滲透測試基本技術 第二章(後篇)

使用 Sass 管理 CSS

使用 Sass 管理 CSS


Comments